﻿using CristoRessuscitado.BancoDados;
using CristoRessuscitado.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CristoRessuscitado.Formularios
{
    public partial class FormCadCasal : Form, IFormCadPadrao
    {
        private static  FormCadCasal    form;
        public  static  FormCadCasal    GetInstance()   { return form; }

        private         DatabaseContext dbContext;

        public          int             IdEsposo        { get; set; }
        public          int             IdEsposa        { get; set; }

        private         Pessoa          pessoaEsposo;
        private         Pessoa          pessoaEsposa;

        private         Casal           casal;

        public FormCadCasal()
        {
            InitializeComponent();
            form = this;
        }

        // ---------------------------------------------------------------------------------------------------------------------------
        //
        // Eventos
        //
        // ---------------------------------------------------------------------------------------------------------------------------

        private void FormCadCasal_Load(object sender, EventArgs e)
        {
            Inicializar();
        }

        private void FormCadCasal_KeyDown(object sender, KeyEventArgs e)
        {
            OnTecladoKeyDown(e);
        }

        private void btnTrazerEsposo_Click(object sender, EventArgs e)
        {
            AbrirFormularioConsultaPessoasParaTrazerEsposo();
        }

        private void btnTrazerEsposa_Click(object sender, EventArgs e)
        {
            AbrirFormularioConsultaPessoasParaTrazerEsposa();
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            if (Validar())
            {
                Salvar();
                Close();
            }
        }

        // ---------------------------------------------------------------------------------------------------------------------------
        //                                                                                                                           
        // Métodos Auxiliares                                                                                                        
        //                                                                                                                           
        // ---------------------------------------------------------------------------------------------------------------------------

        public void OnTecladoKeyDown(KeyEventArgs e)
        {
            if (e.KeyCode == (Keys.Escape))
            {
                Close();
            }
        }

        public void Inicializar()
        {
            dbContext = new DatabaseContext();
            KeyPreview = true;
            Text = "Incluir Casal";

            PopularCamposParaInclusao();
        }

        public void PopularCamposParaInclusao()
        {
            lblEsposoNome.Text = String.Empty;
            lblEsposoDataNascimento.Text = String.Empty;
            lblEsposoEmail.Text = String.Empty;
            lblEsposoTelefone.Text = String.Empty;
            lblEsposoCelular.Text = String.Empty;

            lblEsposaNome.Text = String.Empty;
            lblEsposaDataNascimento.Text = String.Empty;
            lblEsposaEmail.Text = String.Empty;
            lblEsposaTelefone.Text = String.Empty;
            lblEsposaCelular.Text = String.Empty;

            dtpDataCasamento.Format = DateTimePickerFormat.Custom;
            dtpDataCasamento.CustomFormat = VarConUtils.FORMATO_DATA_A;
        }

        public void PopularCamposParaAlteracao()
        {}

        public bool Validar()
        {
            DateTime dataCasamento = dtpDataCasamento.Value;
            if (dataCasamento > DateTime.Now)
            {
                GeralUtils.ExibirDialogMsgValidacao(this, "Data de casamento inválida.");
                dtpDataCasamento.Focus();
                return false;
            }

            if (pessoaEsposo == null)
            {
                GeralUtils.ExibirDialogMsgValidacao(this, "Informe o esposo.");
                return false;
            }

            if (pessoaEsposa == null)
            {
                GeralUtils.ExibirDialogMsgValidacao(this, "Informe a esposa.");
                return false;
            }

            bool esposoJaVinculadoAUmCasal = dbContext.Casal.Any(c => c.IdPessoaEsposo == IdEsposo);
            if (esposoJaVinculadoAUmCasal)
            {
                GeralUtils.ExibirDialogMsgValidacao(this, "O esposo informado já está vinculado a um casal.");
                return false;
            }

            bool esposaJaVinculadoAUmCasal = dbContext.Casal.Any(c => c.IdPessoaEsposa == IdEsposa);
            if (esposaJaVinculadoAUmCasal)
            {
                GeralUtils.ExibirDialogMsgValidacao(this, "A esposa informada já está vinculada a um casal.");
                return false;
            }

            return true;
        }

        public void Salvar()
        {
            casal = new Casal()
            {
                DataCasamento = dtpDataCasamento.Value.Date,
                IdPessoaEsposo = IdEsposo,
                IdPessoaEsposa = IdEsposa
            };

            dbContext.Casal.Add(casal);
            dbContext.SaveChanges();
        }

        private void AbrirFormularioConsultaPessoasParaTrazerEsposo()
        {
            FormConsultaPessoas frm = new FormConsultaPessoas();
            frm.SelecionarEsposo = true;
            frm.ShowDialog(this);

            if (IdEsposo != 0)
            {
                pessoaEsposo = dbContext.Pessoa.Find(IdEsposo);
                popularCamposEsposo();
                btnTrazerEsposo.Text = "Trocar Esposo";
            }
        }

        private void popularCamposEsposo()
        {
            if (pessoaEsposo != null)
            {
                lblEsposoNome.Text = pessoaEsposo.NomeCompleto;
                lblEsposoDataNascimento.Text = 
                    pessoaEsposo.DataNascimento.HasValue ? pessoaEsposo.DataNascimento.Value.ToString(VarConUtils.FORMATO_DATA_A) : String.Empty;
                lblEsposoEmail.Text = pessoaEsposo.Email;
                GeralUtils.FormatarLabelTipoTelefone(lblEsposoTelefone, pessoaEsposo.TelefoneResidencial);
                GeralUtils.FormatarLabelTipoTelefone(lblEsposoCelular, pessoaEsposo.TelefoneCelular);
            }
        }

        private void AbrirFormularioConsultaPessoasParaTrazerEsposa()
        {
            FormConsultaPessoas frm = new FormConsultaPessoas();
            frm.SelecionarEsposa = true;
            frm.ShowDialog(this);

            if (IdEsposa != 0)
            {
                pessoaEsposa = dbContext.Pessoa.Find(IdEsposa);
                popularCamposEsposa();
                btnTrazerEsposa.Text = "Trocar Esposa";
            }
        }

        private void popularCamposEsposa()
        {
            if (pessoaEsposa != null)
            {
                lblEsposaNome.Text = pessoaEsposa.NomeCompleto;
                lblEsposaDataNascimento.Text =
                    pessoaEsposa.DataNascimento.HasValue ? pessoaEsposa.DataNascimento.Value.ToString(VarConUtils.FORMATO_DATA_A) : String.Empty;
                lblEsposaEmail.Text = pessoaEsposa.Email;
                GeralUtils.FormatarLabelTipoTelefone(lblEsposaTelefone, pessoaEsposa.TelefoneResidencial);
                GeralUtils.FormatarLabelTipoTelefone(lblEsposaCelular, pessoaEsposa.TelefoneCelular);
            }
        }
    }
}
